package 回显程序;

import javax.xml.crypto.Data;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;

//回显程序的客户端
public class UdpEchoClient {
    private DatagramSocket socket=null;
    private String serverIp;
    private int serverPort;

    //客户端一启动，就需要知道 服务器的ip和端口号
    //但是服务器启动的时候是无法知道客户端的ip和端口号的，直到客户端的请求到了，服务器才知道对应客户端的ip和端口号
    public  UdpEchoClient(String serverIp,int serverPort) throws SocketException {
        this.serverIp=serverIp;
        this.serverPort=serverPort;
        this.socket=new DatagramSocket();//客户端不需要指定端口号，操作系统会分配一个空闲的端口号，给客户端使用

    }

    public void start() throws IOException {
        //1.从标准输入中读入一个数据
        Scanner scanner=new Scanner(System.in);

        while (true) {
            System.out.println("->");
            String request = scanner.nextLine();
            if (request.equals("exit")) {
                System.out.println("程序退出！！");
                return;
            }

            //2.将输入的字符串构造成一个 UDP请求

            //requestPacket 中既要包含数据的具体内容，还要包含这个数据发给谁
            DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIp),serverPort);

            //3.发送 UDP请求
            socket.send(requestPacket);

            //4.尝试读取来自服务器的响应
            DatagramPacket reponsePacket=new DatagramPacket(new byte[4096],4096);//构造一个空的数据报
            socket.receive(reponsePacket);

            //5.显示响应
            String response=new String(reponsePacket.getData(),0,reponsePacket.getLength());
            //reponsePacket.getData() 取数组，从0下标到Length下标，将数组中的元素全部获取
            String log=String.format("request: %s , response: %s",request,response);
            System.out.println(log);
        }

    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient client=new UdpEchoClient("127.0.0.1",9090);//服务器的IP和端口号
        client.start();

    }
}
